package acme.bloodtime.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import modelo.IArticuloDO;
import modelo.ICiudadArticuloDAO;
import modelo.ICiudadArticuloDO;
import modelo.ICiudadDO;

import dao.api.DataObject;
import dao.api.Reference;

/**
 * 
 * @author Alejandra Alvarez I.
 * 
 */
public class CiudadArticuloDAO extends BloodTimeBaseDAO implements ICiudadArticuloDAO {

    public CiudadArticuloDAO() {
        // Empty
    }

    @Override
    protected CiudadArticuloDO resultSetToDO(ResultSet rs) throws SQLException {
        CiudadArticuloDO ret = //
        (CiudadArticuloDO) dtaSession.getDtaByKey( //
                CiudadArticuloDO.class, rs.getInt(CiudadArticuloDO.ID));

        if (ret != null) {
            return ret;
        }

        ret = new CiudadArticuloDO();

        ret.setId/*     			*/(rs.getInt(CiudadArticuloDO.ID));

        // ----------------------------
        // Setting the reference id's
        // ----------------------------

        Reference<IArticuloDO> articuloRef = new Reference<IArticuloDO>();
        articuloRef.setRefIdent(rs.getInt(CiudadArticuloDO.ARTICULO_ID));

        // ------------
        // Articulo Id
        // ------------
        ret.setArticuloId(articuloRef);

        Reference<ICiudadDO> ciudadRef = new Reference<ICiudadDO>();
        ciudadRef.setRefIdent(rs.getInt(CiudadArticuloDO.CIUDAD_ID));

        // -----------
        // Ciudad Id
        // -----------

        ret.setCiudadId(ciudadRef);

        return (CiudadArticuloDO) dtaSession.add(ret);
    }

    @Override
    public void createTable() throws SQLException {
        StringBuffer strbuf;

        // ----------------------------------------

        strbuf = new StringBuffer();

        dropTable();

        System.err.println(strbuf.toString());

        connection.createStatement().execute(strbuf.toString());

        // ----------------------------------------

        strbuf = new StringBuffer();

        strbuf.append("CREATE TABLE ");
        strbuf.append(getTableName());
        strbuf.append(" (");
        strbuf.append(CiudadArticuloDO.ID);
        strbuf.append(" SERIAL PRIMARY KEY,    ");
        strbuf.append(CiudadArticuloDO.CIUDAD_ID);
        strbuf.append(" INT REFERENCES ");

        CiudadDAO ciudadDAO = new CiudadDAO();
        strbuf.append(ciudadDAO.getTableName());

        strbuf.append(", ");

        strbuf.append(CiudadArticuloDO.ARTICULO_ID);
        strbuf.append(" INT REFERENCES ");

        ArticuloDAO articuloDAO = new ArticuloDAO();
        strbuf.append(articuloDAO.getTableName());

        strbuf.append(")");

        System.err.println(strbuf.toString());

        connection.createStatement().execute(strbuf.toString());
    }

    @Override
    public void delete(DataObject dataObject) throws SQLException {
        internalDelete(dataObject, CiudadArticuloDO.class);
    }

    @Override
    public void insert(DataObject dataObject) throws SQLException {
        checkCache(dataObject, CHECK_INSERT);
        checkClass(dataObject, CiudadArticuloDO.class, CHECK_INSERT);

        CiudadArticuloDO ciudadArticuloDO = (CiudadArticuloDO) dataObject;

        ciudadArticuloDO.setId(getNextId());

        StringBuffer strbuf = new StringBuffer();

        strbuf.append("INSERT INTO ");
        strbuf.append(getTableName());
        strbuf.append(" VALUES (");
        strbuf.append(ciudadArticuloDO.getId());
        strbuf.append(", ");

        // --------------------------------
        // Setting the Reference to Ciudad
        // --------------------------------

        Reference<ICiudadDO> ciudadRef = ciudadArticuloDO.getCiudadId();
        ciudadRef.checkInsert();

        strbuf.append(ciudadRef.getIdAsString());
        strbuf.append(", ");

        // --------------------------------
        // Setting the Reference to Articulo
        // --------------------------------

        Reference<IArticuloDO> articuloRef = ciudadArticuloDO.getArticuloId();
        ciudadRef.checkInsert();

        strbuf.append(articuloRef.getIdAsString());
        strbuf.append(")");

        System.err.println(strbuf.toString());

        connection.createStatement().executeUpdate(strbuf.toString());

        dtaSession.add(dataObject);
    }

    @Override
    public void update(DataObject dataObject) throws SQLException {
        checkCache(dataObject, CHECK_UPDATE);
        checkClass(dataObject, CiudadArticuloDO.class, CHECK_UPDATE);

        CiudadArticuloDO ciudadArticuloDO = (CiudadArticuloDO) dataObject;

        StringBuffer strbuf = new StringBuffer();

        strbuf.append("UPDATE ");
        strbuf.append(getTableName());
        strbuf.append(" SET ");

        // ----------------------------
        // Set Ciudad Reference Id
        // ----------------------------

        Reference<ICiudadDO> ciudadRef = ciudadArticuloDO.getCiudadId();
        ciudadRef.checkUpdate();

        strbuf.append(CiudadArticuloDO.CIUDAD_ID);
        strbuf.append(" = ");
        strbuf.append(ciudadRef.getIdAsString());

        strbuf.append(", ");

        // ----------------------------
        // Set Articulo Reference Id
        // ----------------------------

        Reference<IArticuloDO> articuloRef = ciudadArticuloDO.getArticuloId();
        ciudadRef.checkUpdate();

        strbuf.append(CiudadArticuloDO.ARTICULO_ID);
        strbuf.append(" = ");
        strbuf.append(articuloRef.getIdAsString());

        strbuf.append(" WHERE ");
        strbuf.append(CiudadArticuloDO.ID);
        strbuf.append(" = ");
        strbuf.append(ciudadArticuloDO.getId());

        System.err.println(strbuf.toString());

        connection.createStatement().executeUpdate(strbuf.toString());
    }

    public void loadCiudadRef(ICiudadArticuloDO ciudadArticuloDO) throws SQLException {
        checkClass(ciudadArticuloDO, CiudadArticuloDO.class, CHECK_UPDATE);

        CiudadDAO ciudadDAO = new CiudadDAO();
        ciudadDAO.init(connectionBean);

        Reference<ICiudadDO> ref = ciudadArticuloDO.getCiudadId();

        // ----------------------------------------
        // If ident == 0 there is nothing to do
        // ----------------------------------------

        if (ref.getRefIdent() == 0) {
            return;
        }

        CiudadDO ciudadDO = //
        (CiudadDO) ciudadDAO.loadById(ref.getRefIdent());

        ref.setRefValue(ciudadDO);
    }

    public void loadArticuloRef(ICiudadArticuloDO ciudadArticuloDO) throws SQLException {
        checkClass(ciudadArticuloDO, CiudadArticuloDO.class, CHECK_UPDATE);

        ArticuloDAO articuloDAO = new ArticuloDAO();
        articuloDAO.init(connectionBean);

        Reference<IArticuloDO> ref = ciudadArticuloDO.getArticuloId();

        // ----------------------------------------
        // If ident == 0 there is nothing to do
        // ----------------------------------------

        if (ref.getRefIdent() == 0) {
            return;
        }

        ArticuloDO articuloDO = //
        (ArticuloDO) articuloDAO.loadById(ref.getRefIdent());

        ref.setRefValue(articuloDO);
    }

    public List<ICiudadArticuloDO> listByCiudadId(int ciudadId) throws SQLException {
        StringBuffer strbuf = new StringBuffer();

        strbuf.append("SELECT * FROM ");
        strbuf.append(getTableName());

        strbuf.append(" WHERE ");
        strbuf.append(CiudadArticuloDO.CIUDAD_ID);
        strbuf.append(" = ");
        strbuf.append(ciudadId);

        System.err.println(strbuf.toString());

        ResultSet rs = //
        connection.createStatement().executeQuery(strbuf.toString());

        List<ICiudadArticuloDO> ret = new ArrayList<ICiudadArticuloDO>();

        while (rs.next()) {
            ret.add(resultSetToDO(rs));
        }

        return ret;
    }

    public List<ICiudadArticuloDO> listByArticuloId(int articuloId) throws SQLException {
        StringBuffer strbuf = new StringBuffer();

        strbuf.append("SELECT * FROM ");
        strbuf.append(getTableName());

        strbuf.append(" WHERE ");
        strbuf.append(CiudadArticuloDO.ARTICULO_ID);
        strbuf.append(" = ");
        strbuf.append(articuloId);

        System.err.println(strbuf.toString());

        ResultSet rs = //
        connection.createStatement().executeQuery(strbuf.toString());

        List<ICiudadArticuloDO> ret = new ArrayList<ICiudadArticuloDO>();

        while (rs.next()) {
            ret.add(resultSetToDO(rs));
        }

        return ret;
    }
}
